﻿package com.cw.war.ui
{
	import flash.events.Event;
	import flash.events.EventDispatcher;

	/**
	 * 跑秒器。对象对一段时间进行倒计时，进行跑秒处理。
	 * @author DanielLu
	 */
	public class Ticker extends EventDispatcher
	{
		public static const ON_START : String = "onStart";
		public static const ON_TICKER : String = "onTicker";
		public static const ON_COMPLETED : String = "onCompleted";
		public static const ON_STOP : String = "onStop";

		//-----------------------------------
		//默认的每一跑秒间隔中减少的时间
		private static const CHANGE : int = 1000;

		private var needTime : Number;
		private var remainTime : Number;
		private var changeSeconds : Number;
		private var running : Boolean;

		/**
		 * 创建一个<code>Ticker</code>对象。
		 */
		public function Ticker ()
		{
			this.needTime = 0;
			this.remainTime = 0;
			this.changeSeconds = CHANGE;
			this.running = false;
		}

		/**
		 * 设置需要倒计时的时间。以毫秒为单位。
		 * @param needTime	需要被倒计时时间。
		 */
		public function setNeedTime (needTime : Number) : void
		{
			this.needTime = isNaN( needTime ) ? 0 : needTime;
		}

		/**
		 * 返回剩余时间。如果跑秒器为执行，则返回需要的时间。以毫秒为单位。
		 * @return		倒计时剩余时间。
		 */
		public function getRemainTime () : Number
		{
			return this.isRunning( ) ? this.remainTime : this.needTime;
		}

		/**
		 * 开始倒计时。
		 * @throws	Error - 设置的结束时间小于开始时间。
		 */
		public function start () : void
		{
			if(! this.running)
			{
				this.remainTime = this.needTime;
				if(this.remainTime > 0)
				{
					Time.getInstance( ).addTimerListener( this.__onTicker );
					this.running = true;
					this.fireStart( );
				}
				else
				{
					this.remainTime = 0;
					throw new Error( "设置的结束时间小于或等于开始时间，请检查数据" );
				}
			}
		}

		private function __onTicker (e : Event) : void
		{
			this.remainTime -= this.changeSeconds;
			if(this.remainTime > 0)
			{
				this.fireTicker( );
			}
			else
			{
				this.end( );
				this.fireCompleted( );	
			}
		}

		/**
		 * 停止倒计时。方法会停止当前的计时器。
		 */
		public function stop () : void
		{
			if(this.running)
			{
				this.end( );
				this.fireStop( );
			}
		}

		private function end () : void
		{
			Time.getInstance( ).removeTimerListener( this.__onTicker );
			this.running = false;
		}

		/**
		 * 返回计时器是否正在运行。
		 * @return		计时器是否正在运行。
		 */
		public function isRunning () : Boolean
		{
			return this.running;
		}

		//------------------------------------------------------------------------------------事件处理
		/**
		 * 添加倒计时开始侦听器。
		 * @param listener			侦听器
		 * @param priority			优先级
		 * @param useWeakReference	弱引用
		 */
		public function addStartListener (listener : Function, priority : int = 0, useWeakReference : Boolean = false) : void
		{
			this.addEventListener( ON_START , listener , false , priority , useWeakReference );
		}

		/**
		 * 删除倒计时开始侦听器。
		 * @param listener		侦听器。
		 */
		public function removeStartListener (listener : Function) : void
		{
			this.removeEventListener( ON_START , listener , false );
		}

		/**
		 * 添加跑秒侦听器。
		 * @param listener			侦听器
		 * @param priority			优先级
		 * @param useWeakReference	弱引用
		 */
		public function addTickerListener (listener : Function, priority : int = 0, useWeakReference : Boolean = false) : void
		{
			this.addEventListener( ON_TICKER , listener , false , priority , useWeakReference );
		}

		/**
		 * 删除跑秒侦听器。
		 * @param listener			侦听器。
		 */
		public function removeTickerListener (listener : Function) : void
		{
			this.removeEventListener( ON_TICKER , listener , false );
		}

		/**
		 * 添加跑秒完成侦听器。
		 * @param listener			侦听器
		 * @param priority			优先级
		 * @param useWeakReference	弱引用
		 */
		public function addCompletedListener (listener : Function, priority : int = 0, useWeakReference : Boolean = false) : void
		{
			this.addEventListener( ON_COMPLETED , listener , false , priority , useWeakReference );
		}

		/**
		 * 删除跑秒完成侦听器。 
		 * @param listener		侦听器。
		 */
		public function removeCompletedListener (listener : Function) : void
		{
			this.removeEventListener( ON_COMPLETED , listener , false );
		}

		/**
		 * 添加跑秒停止侦听器。
		 * @param listener			侦听器
		 * @param priority			优先级
		 * @param useWeakReference	弱引用
		 */
		public function addStopListener (listener : Function, priority : int = 0, useWeakReference : Boolean = false) : void
		{
			this.addEventListener( ON_STOP , listener , false , priority , useWeakReference );
		}

		/**
		 * 删除跑秒停止侦听器。
		 * @param listener		侦听器。
		 */
		public function removeStopListener (listener : Function) : void
		{
			this.removeEventListener( ON_STOP , listener );
		}

		/**
		 * 发送倒计时开始的事件。
		 */
		protected function fireStart () : void
		{
			this.dispatchEvent( new Event( ON_START ) );
		}

		/**
		 * 发送正在倒计时的事件。
		 */
		protected function fireTicker () : void
		{	
			this.dispatchEvent( new Event( ON_TICKER ) );
		}

		/**
		 * 发送倒计时结束的事件。
		 */
		protected function fireCompleted () : void
		{	
			this.dispatchEvent( new Event( ON_COMPLETED ) );
		}

		/**
		 * 发送跑秒器停止的事件。
		 */
		protected function fireStop () : void
		{
			this.dispatchEvent( new Event( ON_STOP ) );
		}
	}
}
